home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Shareware Grab Bag
/
Shareware Grab Bag.iso
/
001
/
zeno.arc
/
ZENO.ASM
next >
Wrap
Assembly Source File
|
1986-06-11
|
12KB
|
340 lines
page 66,132
page
; X:0
;
; ZENO: June 11, 1986
;
cseg segment para public 'code'
zeno proc far
assume cs:cseg, ds:cseg, es:cseg, ss:cseg
org 100h ; for .COM file
;
environment equ 2Ch
command equ 80h
slashk equ 'K/'
;
;-------------------------------
; enter here on initial load
;-------------------------------
;
start:
;
jmp near ptr load_pgm
;
video_vector dd 0
core_seg dw 0
;
bios_cursor_posn label dword
bios_ofst dw 00h ; offset for active page
dw 40h ; segment for bios data
;
crt_mode db 2 ; passes if 4, 5, or 6
active_page db 0
cursor_type dw 0B0Ch ; DOS cursor
;
video_posn label dword
video_ofst dw 0 ; offset against video_seg
video_seg dw 0
;
video_addr dw 0
;
onesixty db 160
;
;-------------------------------
; enter here from int 10h
;-------------------------------
;
video_int:
sti ; interrupts on
pushf ; save flags
cmp cs:crt_mode,7 ; check for b/w
je video_keep ; go if b/w
cmp cs:crt_mode,4 ; check for graphics
jnc video_exit ; go if graphics
video_keep:
cmp ah,2 ; to set cursor
je set_cursor
cmp ah,10 ; to write char only
je write_char
cmp ah,9 ; to write char/attr
je route_write_both
cmp ah,3 ; to read cursor
je route_read_cursor
cmp ah,1 ; to set type
je route_set_type
cmp ah,0 ; to set mode
je route_set_mode
cmp ah,5 ; to set page
je route_set_page
cmp ax,0FF00h ; kill code
je route_do_kill ; go if found
video_exit:
popf ; restore flags
jmp cs:dword ptr video_vector ; hand off interrupt
;
route_write_both:
jmp write_both
;
route_read_cursor:
jmp read_cursor
;
route_set_page:
jmp set_page
;
route_set_type:
jmp set_type
;
route_set_mode:
jmp set_mode
;
route_do_kill:
jmp do_kill
;
write_char:
cmp bh,cs:active_page ; check page
jne video_exit ; pass to bios
cmp cx,1 ; for multiple write
jne video_exit ; pass to bios
push di ; save
push es ; save
les di,cs:video_posn ; get screen position
cld ; frontwards
stosb ; dump to screen
pop es ; restore
pop di ; restore
popf ; restore flags
iret ; done
;
set_cursor:
cmp bh,cs:active_page ; check page
jne video_exit ; pass to bios
push ax ; save
push cx ; save
push dx ; save
push di ; save
push es ; save
add cs:video_ofst,2 ; for next char
les di,cs:bios_cursor_posn ; get bios
inc byte ptr es:[di] ; assume next
cmp es:[di],dx ; check if next
je offset_ready ; go if next
mov ax,dx ; get req posn
mov es:[di],ax ; save req posn
mov cx,ax ; copy posn
mov al,ah ; rows in al
mul cs:onesixty ; for bytes
xor ch,ch ; cols in cx
shl cx,1 ; for video
add ax,cx ; offset in ax
mov cs:video_ofst,ax ; store offset
offset_ready:
mov cx,cs:video_ofst ; offset in cx
shr cx,1 ; for byte count
mov ah,14 ; cursor MSB register
mov dx,cs:video_addr ; 6845 index addr
mov al,ah ; get register
out dx,al ; send register
inc dx ; 6845 data addr
mov al,ch ; get cursor MSB
out dx,al ; send cursor MSB
dec dx ; 6845 index addr
mov al,ah ; cursor MSB register
inc al ; cursor LSB register
out dx,al ; send register
inc dx ; 6845 data addr
mov al,cl ; get cursor LSB
out dx,al ; send cursor LSB
pop es ; restore
pop di ; restore
pop dx ; restore
pop cx ; restore
pop ax ; restore
popf ; restore flags
iret ; done
;
route_video_exit:
jmp video_exit
;
write_both:
cmp bh,cs:active_page ; check page
jne route_video_exit ; pass to bios
cmp cx,1 ; check multiple write
jne route_video_exit ; pass to bios
push ax ; save
push di ; save
push es ; save
mov ah,bl ; get attribute
les di,cs:video_posn ; get screen position
cld ; frontwards
stosw ; dump to screen
pop es ; restore
pop di ; restore
pop ax ; restore
popf ; restore flags
iret ; done
;
read_cursor:
cmp bh,cs:active_page ; check page
jne route_video_exit ; pass to bios
push di ; save
push es ; save
les di,cs:bios_cursor_posn ; get bios
mov dx,es:[di] ; get bios posn
mov cx,cs:cursor_type ; get type
pop es ; restore
pop di ; restore
popf ; restore flags
iret ; done
;
set_page:
push ax ; save
mov cs:active_page,al ; save page
xor ah,ah ; page in ax
shl ax,1 ; for word count
add ax,50h ; offset for page zero
mov cs:bios_ofst,ax ; save offset
pop ax ; restore
jmp video_exit ; pass to bios
;
set_type:
mov cs:cursor_type,cx ; save type
jmp video_exit ; pass to bios
;
set_mode:
mov cs:crt_mode,al ; save mode
mov cs:video_ofst,0 ; top left
jmp video_exit ; done
;
; remove routine from memory
;
do_kill:
mov ax,cs ; get code segment
mov ds,ax ; set data segment
mov es,ax ; set extra segment
push ds ; save
mov ax,2510h ; to set video vector
lds dx,video_vector ; get original
int 21h ; set vector
pop ds ; restore
mov ah,49h ; for free memory fn
int 21h ; do free memory
push es ; save
mov bx,environment ; get env. segment
mov es,cs:[bx]
mov ah,49h ; for free memory fn
int 21h ; do free memory
pop es ; restore
lea dx,kill_msg ; get message
mov ah,9 ; for screen write
int 21h ; do write
popf ; restore flags
iret ; return to ZENO/K
;
kill_msg db 13,10,'ZENO Removed',13,10,'$'
;
end_core:
;
;-------------------------------
; enter here to load program
;-------------------------------
;
load_pgm:
;
; check for color screen; set video segment
;
mov video_seg,0B000h ; assume mono
mov video_addr,03B4h ; assume mono
int 11h ; for equip check
and ax,30h ; isolate adapter
cmp ax,30h ; check for mono
je mono_screen ; go if found
mov video_seg,0B800h ; reset for color
mov video_addr,03D4h ; reset for color
mono_screen:
;
; check command line
;
mov si,command ; get command line
mov al,cs:[si] ; length of argument
or al,al ; check for zero
je command_clear ; go if zero
cmp al,2 ; for kill request
jne retry ; go if not
cmp word ptr cs:[si+1],slashk ; check for '/K'
jne retry ; go if not
mov ax,0FF00h ; set for kill
int 10h ; order kill
int 20h ; exit to DOS
retry:
lea dx,retry_msg ; get message
mov ah,9 ; for print fn
int 21h ; print message
int 20h ; exit to DOS
command_clear:
;
; find and set current variables
;
les di,bios_cursor_posn ; set to 0040:0000
mov al,es:[di+49h] ; get current mode
mov crt_mode,al ; save mode
mov ax,es:[di+60h] ; get cursor type
mov cursor_type,ax ; save type
mov al,es:[di+62h] ; get active page
mov active_page,al ; save active page
xor ah,ah ; page in ax
shl ax,1 ; for word count
add ax,50h ; offset for page zero
mov bios_ofst,ax ; save offset
;
; set video interrupt
;
mov core_seg,cs ; set core segment
push es ; save
mov ax,3510h ; to get vector
int 21h ; get vector
mov video_vector,bx ; store offset
mov video_vector+2,es ; store segment
pop es ; restore
mov ax,2510h ; to set video vector
lea dx,video_int ; get offset; ds OK
int 21h ; set vector
;
; print messages; terminate and stay resident
;
lea dx,install_msg ; get message
mov ah,9h ; for print fn
int 21h ; print message
cmp video_seg,0B000h ; check for mono
je skip_message ; go if mono
lea dx,color_msg ; get message
mov ah,9h ; for print fn
int 21h ; print message
skip_message:
lea dx,finish_msg ; get termination
mov ah,9h ; for print fn
int 21h ; print ternination
lea ax,end_core ; last address in core
add ax,2Fh ; make bumper
mov cl,4 ; for shift
shr ax,cl ; convert to paras
mov bx,ax ; no. paras to keep
mov dx,ax ; same
mov ah,4Ah ; for setblock
int 21h ; do setblock
mov ax,3100h ; for keep; no exit code
int 21h ; exit and stay resident
;
install_msg db 13,10,'ZENO Successfully Installed$'
;
color_msg db ';',13,10,'May Cause Interference.$'
;
finish_msg db 13,10,'$'
;
retry_msg db 13,10,'No Action: Invalid Command Line',13,10,7,'$'
;
zeno endp
cseg ends
end start